前面的文章已經介紹過如何使用 resources.requests 和 resources.limits 設定容器的資源需求,也透過 Metrics Server 觀察 Pod 與 Node 的資源使用情況。
但當 Kubernetes Cluster 同時執行多個應用程式時,如果沒有適當限制,某個 Namespace 可能建立過多 Pod,或配置過多 CPU、Memory 資源,進而影響其他應用程式。
Kubernetes 提供 ResourceQuota 和 LimitRange,讓管理者能夠限制 Namespace 的資源配置。
ResourceQuota 用來限制整個 Namespace 可以使用的資源總量。
例如,可以限制:
首先建立一個測試用 Namespace:
kubectl create namespace quota-demo
接著建立 resourcequota.yaml:
apiVersion: v1
kind: ResourceQuota
metadata:
name: demo-quota
namespace: quota-demo
spec:
hard:
pods: "3"
requests.cpu: "500m"
requests.memory: "512Mi"
limits.cpu: "1"
limits.memory: "1Gi"
這份 YAML 表示:
套用設定:
kubectl apply -f resourcequota.yaml
查看 ResourceQuota:
kubectl describe resourcequota demo-quota -n quota-demo
可以看到 Used 與 Hard 兩個欄位,分別代表目前已配置的資源與允許的上限。
ResourceQuota 限制的是整個 Namespace 的資源總量,而 LimitRange 可以針對 Namespace 中的個別容器設定預設資源值與允許範圍。
例如,當開發者建立容器時沒有指定 requests 和 limits,就可以透過 LimitRange 自動補上預設值。
建立 limitrange.yaml:
apiVersion: v1
kind: LimitRange
metadata:
name: demo-limit
namespace: quota-demo
spec:
limits:
- type: Container
defaultRequest:
cpu: 100m
memory: 64Mi
default:
cpu: 200m
memory: 128Mi
min:
cpu: 50m
memory: 32Mi
max:
cpu: 500m
memory: 512Mi
這裡設定了:
defaultRequest:容器未指定 requests 時使用的預設值。default:容器未指定 limits 時使用的預設值。min:容器允許的最小資源設定。max:容器允許的最大資源設定。套用設定:
kubectl apply -f limitrange.yaml
建立 quota-pod.yaml:
apiVersion: v1
kind: Pod
metadata:
name: quota-test
namespace: quota-demo
spec:
containers:
- name: nginx
image: nginx:stable
這份 YAML 沒有指定 CPU 和 Memory 的 requests、limits。
建立 Pod:
kubectl apply -f quota-pod.yaml
查看 Pod:
kubectl describe pod quota-test -n quota-demo
在容器的資源設定中,應該可以看到 LimitRange 自動補上的預設值:

接著查看 ResourceQuota:
kubectl describe resourcequota demo-quota -n quota-demo
此時 ResourceQuota 的 Used 應該會增加,因為剛剛建立的 Pod 已經配置了資源。
可以繼續建立更多 Pod,觀察當資源配置超過 ResourceQuota 的限制時,Kubernetes 如何拒絕建立新的資源。
例如,嘗試將 Pod 數量增加到超過 3 個,就會以下的錯誤:

這是因為 ResourceQuota 會在建立資源時檢查是否超過 Namespace 的限制。
需要注意的是,ResourceQuota 主要限制資源的配置額度,而不是直接測量或限制整個 Namespace 的即時 CPU、Memory 使用量。
| 比較 | ResourceQuota | LimitRange |
|---|---|---|
| 限制範圍 | 整個 Namespace | 個別容器或 Pod 等 |
| 主要用途 | 限制資源總額 | 限制單一資源的設定 |
| 預設 requests/limits | 不提供 | 可以設定 |
| 限制 Pod 總數 | 可以 | 不負責 |
| 資源超出限制 | 拒絕建立或更新資源 | 拒絕不符合規則的資源 |
兩者可以同時使用,例如:
ResourceQuota 和 LimitRange 都是 Kubernetes 中管理資源的重要工具。
ResourceQuota 可以避免單一 Namespace 配置過多資源,而 LimitRange 可以規範個別容器的資源設定。
透過這兩個工具,管理者可以在同一個 Cluster 中,為不同 Namespace 建立適當的資源配置規則,減少應用程式之間互相影響的機會。